// 01_create_semaphore.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>

#define SEM_KEY 1234  // 定义信号灯集的键

union semun {
    int val;                // 用于 `SETVAL` 命令
    struct semid_ds *buf;   // 用于 `IPC_STAT` 和 `IPC_SET`
    unsigned short *array;  // 用于 `GETALL` 和 `SETALL`
};

int main() {
    int semid;
    union semun sem_union;

    // 创建一个包含 1 个信号灯的信号灯集，权限为 0666
    semid = semget(SEM_KEY, 1, 0666 | IPC_CREAT);
    if (semid == -1) {
        perror("semget 创建信号灯集失败");
        exit(EXIT_FAILURE);
    }

    // 初始化信号灯集中的第一个信号灯的值为 1
    sem_union.val = 1;  
    if (semctl(semid, 0, SETVAL, sem_union) == -1) {
        perror("semctl 初始化信号灯失败");
        exit(EXIT_FAILURE);
    }

    printf("信号灯集创建成功，ID: %d\n", semid);
    return 0;
}